//绘制一个三角形,把颜色数据加进顶点数据中，通过读取着色器源码文件来编译着色器程序
/*
GLAD使用步骤：GLAD可以使OpenGL基础渲染变得十分简单，只需要简单四个步骤就可以完成基础渲染。流程如下：
1.初始化GLAD库，加载所有OpenGL函数指针。
2.创建着色器并附加到着色器程序。
3.构建缓冲对象并附加到顶点属性。
4.使用着色器程序，利用渲染接口将缓冲对象按照指定图元类型渲染出来。
*/
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include "shader.h"
#include "window.h"
#include "gl_object.h"
// settings
static const  int width = 800;
static const  int height = 600;
//三角形 顶点坐标
static float vertices[] = {
        // 位置              // 颜色
        0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,   // 右下
        -0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,   // 左下
        0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f    // 顶部
};
/**
 * 输入事件监听
 */
static void processInput1(GLFWwindow *window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, 1);
}
/**
 * 设置链接顶点属性
 */
static void setVertexAttr()
{

    // 位置属性
    // 第一个参数 0 对应 顶点着色器的 location = 0
    // 第二个参数指定顶点属性的大小。顶点属性是一个vec3，它由3个值组成，所以大小是3。
    // 第三个参数指定数据的类型，这里是GL_FLOAT(GLSL中vec*都是由浮点数值组成的)。
    // 第五个参数叫做步长
    // 第六个参数表示位置数据在缓冲中起始位置的偏移量(Offset)。由于位置数据在数组的开头，所以这里是0
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);

    // 颜色属性
    // 第一个参数 1 对应 顶点着色器的 location = 1
    // 第二个参数指定顶点属性的大小。顶点属性是一个vec3，它由3个值组成，所以大小是3。
    // 第三个参数指定数据的类型，这里是GL_FLOAT(GLSL中vec*都是由浮点数值组成的)。
    // 第五个参数叫做步长
    // 第六个参数表示位置数据在缓冲中起始位置的偏移量(Offset)。由于颜色数据从第三个元素开始，所以这里是3
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
    glEnableVertexAttribArray(1);


}

int main6(void)
{
    //初始化，创建窗口
    GLFWwindow *window = initWindow(width, height, "MY_SHADER");
    //创建着色器程序
    //编译着色器源码，创建着色器程序
    GLuint shaderProgram = compileShaderSource("D:\\CLionProjects\\opengl-mingw\\shader\\shader6.vs",
                                               "D:\\CLionProjects\\opengl-mingw\\shader\\shader6.fs");

    GLuint VBO = createVBO(vertices, sizeof (vertices) / sizeof (float ));
    GLuint VAO = createVAO();
    setVertexAttr();
    //解绑VBO
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    //解绑VAO
    glBindVertexArray(0);

    //一般当你打算绘制多个物体时，你首先要生成/配置所有的VAO（和必须的VBO及属性指针)，然后储存它们供后面使用。当我们打算绘制物体的时候就拿出相应的VAO，绑定它，绘制完物体后，再解绑VAO。
    while (!glfwWindowShouldClose(window))
    {
        processInput1(window);
        //设置清除颜色
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        //使用上面设置的颜色清空屏幕
        glClear(GL_COLOR_BUFFER_BIT);

        //调用glUseProgram函数，用刚创建的程序对象作为它的参数，以激活这个程序对象
        glUseProgram(shaderProgram);
        //绑定VAO
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3); //渲染成三角形
        glBindVertexArray(0);

        //交换颜色缓冲区
        glfwSwapBuffers(window);
        //检查事件
        glfwPollEvents();
    }
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);

    //glfwTerminate会销毁窗口释放资源，因此在调用该函数后，如果想使用glfw库函数，就必须重新初始化。
    glfwTerminate();
    return 0;
}